/**
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。


示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。

示例 4:

输入: s = ""
输出: 0

作者：Big shark@LX
链接：https://juejin.cn/post/7004638318843412493
来源：稀土掘金
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 * @param {*} s 
 * @returns 
 */


/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    //双指针遍历，形成一个滑动窗口
    let l = 0
    // 定义一个字典，记录字符串
    const map = new Map()

    let result = 0;
    for (let r = 0; r < s.length; r++) {
        if (map.has(s[r]) && map.get(s[r]) >= l) {
            l = map.get(s[r]) + 1
        }
        result = Math.max(result, r - l + 1)
        map.set(s[r], r)
    }
    return result
};

// 第二种解法
let lengthOfLongestSubstring1 = function (s) {
    if (s.length === 0) {
        return 0;
    }

    let left = 0;
    let right = 1;
    let max = 0;
    while (right <= s.length) {
        let lr = s.slice(left, right);
        const index = lr.indexOf(s[right]);

        if (index > -1) {
            left = index + left + 1;
        } else {
            lr = s.slice(left, right + 1);
            max = Math.max(max, lr.length);
        }
        right++;
    }
    return max;
};


//第三种解法 滑动数组

function getLongStr(str) {
    let arr = []
    let res = 0
    for (var i = 0; i < str.length; i++) {
        let item = str[i]
        let index = arr.indexOf(item)
        if (index > -1) {
            arr.splice(0, index + 1)
        }
        arr.push(item)
        res = Math.max(res, arr.length)
    }

    return res
}
let s = 'abcabcfgbb'

console.log(getLongStr(s))
console.log(lengthOfLongestSubstring(s))